var deferred = $.Deferred();
// Allow calling with a single dependency as a string
- if ( typeof dependencies === 'string' ) {
+ if ( !Array.isArray( dependencies ) ) {
dependencies = [ dependencies ];
}
return deferred.reject( e ).promise();
}
- mw.loader.enqueue( dependencies, function () {
- deferred.resolve( mw.loader.require );
- }, deferred.reject );
+ mw.loader.enqueue(
+ dependencies,
+ function () { deferred.resolve( mw.loader.require ); },
+ deferred.reject
+ );
return deferred.promise();
};
+ /**
+ * Load a script by URL.
+ *
+ * Example:
+ *
+ * mw.loader.getScript(
+ * 'https://example.org/x-1.0.0.js'
+ * )
+ * .then( function () {
+ * // Script succeeded. You can use X now.
+ * }, function ( e ) {
+ * // Script failed. X is not avaiable
+ * mw.log.error( e.message ); // => "Failed to load script"
+ * } );
+ * } );
+ *
+ * @member mw.loader
+ * @param {string} url Script URL
+ * @return {jQuery.Promise} Resolved when the script is loaded
+ */
+ mw.loader.getScript = function ( url ) {
+ return $.ajax( url, { dataType: 'script', cache: true } )
+ .catch( function () {
+ throw new Error( 'Failed to load script' );
+ } );
+ };
+
// Alias $j to jQuery for backwards compatibility
// @deprecated since 1.23 Use $ or jQuery instead
mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' );
// exposed for cross-file mocks.
delete mw.loader.testCallback;
delete mw.loader.testFail;
+ delete mw.getScriptExampleScriptLoaded;
}
} ) );
} );
} );
+ QUnit.test( '.getScript() - success', function ( assert ) {
+ var scriptUrl = QUnit.fixurl(
+ mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/mediawiki.loader.getScript.example.js'
+ );
+
+ return mw.loader.getScript( scriptUrl ).then(
+ function () {
+ assert.strictEqual( mw.getScriptExampleScriptLoaded, true, 'Data attached to a global object is available' );
+ }
+ );
+ } );
+
+ QUnit.test( '.getScript() - failure', function ( assert ) {
+ assert.rejects(
+ mw.loader.getScript( 'https://example.test/not-found' ),
+ /Failed to load script/,
+ 'Descriptive error message'
+ );
+ } );
+
}() );